package com.tzstcl.gen.util;

import com.tzstcl.commons.utils.StringUtils;
import com.tzstcl.gen.model.GenTable;
import com.tzstcl.gen.model.GenTableColumn;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 代码生成工具类
 */
public class GenUtils {

    private static Logger logger = LoggerFactory.getLogger(GenUtils.class);

    /**
     * 初始化列属性字段
     *
     * @param genTable
     */
    public static void initColumnField(GenTable genTable) {
        for (GenTableColumn column : genTable.getColumns()) {

            // 设置字段说明
            if (StringUtils.isBlank(column.getComments())) {
                column.setComments(column.getName());
            }

            // 设置java类型
            if (StringUtils.startsWithIgnoreCase(column.getJdbcType(), "CHAR")) {
                column.setJavaType("String");
                column.setNewJdbcType("CHAR");
            } else if (StringUtils.startsWithIgnoreCase(column.getJdbcType(), "VARCHAR")) {
                column.setJavaType("String");
                column.setNewJdbcType("VARCHAR");
            } else if (StringUtils.startsWithIgnoreCase(column.getJdbcType(), "NARCHAR")) {
                column.setJavaType("String");
                column.setNewJdbcType("NARCHAR");
            } else if (StringUtils.startsWithIgnoreCase(column.getJdbcType(), "TEXT")) {
                column.setJavaType("String");
                column.setNewJdbcType("LONGVARCHAR");
            } else if (StringUtils.startsWithIgnoreCase(column.getJdbcType(), "LONGTEXT")) {
                column.setJavaType("String");
                column.setNewJdbcType("LONGVARCHAR");
            } else if (StringUtils.startsWithIgnoreCase(column.getJdbcType(), "DOUBLE")) {
                column.setJavaType("Double");
                column.setNewJdbcType("DOUBLE");
            } else if (StringUtils.startsWithIgnoreCase(column.getJdbcType(), "FLOAT")) {
                column.setJavaType("Double");
                column.setNewJdbcType("FLOAT");
            } else if (StringUtils.startsWithIgnoreCase(column.getJdbcType(), "CLOB")) {
                column.setJavaType("Clob");
                column.setNewJdbcType("CLOB");
            } else if (StringUtils.startsWithIgnoreCase(column.getJdbcType(), "TIMESTAMP")) {
                column.setJavaType("Date");
                column.setNewJdbcType("TIMESTAMP");
                column.setShowType("dateselect");
            } else if (StringUtils.startsWithIgnoreCase(column.getJdbcType(), "DATETIME")) {
                column.setJavaType("Date");
                column.setNewJdbcType("TIMESTAMP");
                column.setShowType("dateselect");
            } else if (StringUtils.startsWithIgnoreCase(column.getJdbcType(), "DATE")) {
                column.setJavaType("Date");
                column.setNewJdbcType("DATE");
                column.setShowType("dateselect");
            } else if (StringUtils.startsWithIgnoreCase(column.getJdbcType(), "DECIMAL")) {
                column.setJavaType("BigDecimal");
                column.setNewJdbcType("DECIMAL");
            } else if (StringUtils.startsWithIgnoreCase(column.getJdbcType(), "BIGINT")
                    || StringUtils.startsWithIgnoreCase(column.getJdbcType(), "NUMBER")
                    || StringUtils.startsWithIgnoreCase(column.getJdbcType(), "INT")
                    || StringUtils.startsWithIgnoreCase(column.getJdbcType(), "INTEGER")
            ) {
                // 如果是浮点型
                String[] ss = StringUtils.split(StringUtils.substringBetween(column.getJdbcType(), "(", ")"), ",");
                if (ss != null && ss.length == 2 && Integer.parseInt(ss[1]) > 0) {
                    column.setJavaType("Double");
                }
                // 如果是整形
                else if (ss != null && ss.length == 1 && Integer.parseInt(ss[0]) <= 10) {
                    column.setJavaType("Integer");
                }
                // 长整形
                else {
                    column.setJavaType("Long");
                }
                if (StringUtils.startsWithIgnoreCase(column.getJdbcType(), "BIGINT")) {
                    column.setNewJdbcType("BIGINT");
                } else if (StringUtils.startsWithIgnoreCase(column.getJdbcType(), "INT")) {
                    column.setNewJdbcType("INTEGER");
                } else {
                    column.setNewJdbcType("NUMBER");
                }
            } else if (StringUtils.startsWithIgnoreCase(column.getJdbcType(), "BLOB")) {
                column.setJavaType("Object");
                column.setNewJdbcType("BLOB");
            } else {
                column.setJavaType("Object");
                column.setNewJdbcType(column.getJdbcType());
            }

            // 设置java字段名
            column.setJavaField(Hump.toCamelCase(column.getName()));

            // 是否是主键
            column.setIsPk("0");

            // 插入字段
            column.setIsInsert("1");

            // 编辑字段
            if (!StringUtils.equalsIgnoreCase(column.getName(), "id")
                    && !StringUtils.equalsIgnoreCase(column.getName(), "create_by")
                    && !StringUtils.equalsIgnoreCase(column.getName(), "create_time")
                    && !StringUtils.equalsIgnoreCase(column.getName(), "del_flag")) {
                column.setIsEdit("1");
            }

            // 列表字段
            if (StringUtils.equalsIgnoreCase(column.getName(), "name")
                    || StringUtils.equalsIgnoreCase(column.getName(), "title")
                    || StringUtils.equalsIgnoreCase(column.getName(), "remarks")
                    || StringUtils.equalsIgnoreCase(column.getName(), "update_time")) {
                column.setIsList("1");
            }

            // 查询字段
            if (StringUtils.equalsIgnoreCase(column.getName(), "name")
                    || StringUtils.equalsIgnoreCase(column.getName(), "title")) {
                column.setIsQuery("1");
            }

            // 查询字段类型
            if (StringUtils.equalsIgnoreCase(column.getName(), "name")
                    || StringUtils.equalsIgnoreCase(column.getName(), "title")) {
                column.setQueryType("like");
            }

            // 设置特定类型和字段名
            // 创建者、更新者
            else if (StringUtils.startsWithIgnoreCase(column.getName(), "create_by")
                    || StringUtils.startsWithIgnoreCase(column.getName(), "update_by")) {
                column.setJavaType("String");
            }
            // 创建时间、更新时间
            else if (StringUtils.startsWithIgnoreCase(column.getName(), "create_time")
                    || StringUtils.startsWithIgnoreCase(column.getName(), "update_time")) {
                column.setJavaType("Date");
                column.setShowType("dateselect");
            }
            // 备注、内容
            else if (StringUtils.equalsIgnoreCase(column.getName(), "remarks")
                    || StringUtils.equalsIgnoreCase(column.getName(), "content")) {
                column.setShowType("textarea");
            }
            // 删除标记
            else if (StringUtils.equalsIgnoreCase(column.getName(), "del_flag")) {
                column.setShowType("radiobox");
                column.setDictType("del_flag");
            }
        }
    }
}
